package com.ads.tpgrupo4.server.service.generarCotizacionesPendientes;

import java.util.List;

import com.ads.tpgrupo4.domain.cpr.cotizacion.Cotizacion;
import com.ads.tpgrupo4.domain.cpr.cotizacion.EstadoCotizacion;
import com.ads.tpgrupo4.domain.cpr.solicitudDeCotizacion.SolicitudDeCotizacion;
import com.ads.tpgrupo4.server.config.Config;
import com.ads.tpgrupo4.server.fileserver.FileServer;
import com.ads.tpgrupo4.server.remote.PersistenceService;
import com.ads.tpgrupo4.server.utils.UriUtils;
import com.ads.tpgrupo4.server.xml.XmlSource;
import com.ads.tpgrupo4.server.xml.mappers.CotizacionXmlMapper;

public class GenerarCotizacionesPendientesService {
	
	private PersistenceService persistenceService = PersistenceService.getInstance();

	private Cotizador cotizador = Cotizador.getInstance();
	
	private static GenerarCotizacionesPendientesService instance;
	
	public static GenerarCotizacionesPendientesService getInstance() {

		if (instance == null) {
			instance = new GenerarCotizacionesPendientesService();
		}
		
		return instance;
	}
	
	private GenerarCotizacionesPendientesService() {
	}
	
	public void generarCotizacionesPendientes() {
		
		try {
		
			final List<SolicitudDeCotizacion> solicitudesPendientes = this.persistenceService.findSolicitudesDeCotizacionPendientes();

			for (final SolicitudDeCotizacion solicitudDeCotizacion : solicitudesPendientes) {
				
				final Cotizacion cotizacion = this.cotizador.cotizar(solicitudDeCotizacion);
				if (cotizacion != null) {
					// save cotizacion, update solicitud
					cotizacion.setEstadoCotizacion(EstadoCotizacion.REMITIDA);
					this.persistenceService.saveCotizacion(cotizacion);
					this.persistenceService.updateEstadoSolicitudDeCotizacion(solicitudDeCotizacion.getId(), solicitudDeCotizacion.getEstadoSolicitud());
					
					this.trySaveToFileSystem(cotizacion);
				}
			}
			
		} catch (final Exception e) {
			
			throw new GenerarCotizacionesPendientesServiceException(e);
		}
	}
	
	private void trySaveToFileSystem(final Cotizacion cotizacion) {
		try {
		
			final String fileName = OutputFilesUrlUtils.getExpectedFileNameFor(cotizacion);
			final String filePath = UriUtils.buildPath(Config.getInstance().getGeneratedFilesContainerDir(), fileName);
	
			final XmlSource asXml = CotizacionXmlMapper.getInstance().map(cotizacion);
			
			FileServer.createFile(asXml.toString(), filePath);
			
		} catch (final Exception e) {
			e.printStackTrace();
		}
	}

}
